home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 June / PCpro_2006_06.ISO / files / freeware / openvip.exe / {app} / PreviewFrame.py < prev    next >
Encoding:
Python Source  |  2003-06-18  |  4.5 KB  |  127 lines

  1. #
  2. # This file is part of OpenVIP (http://openvip.sourceforge.net)
  3. #
  4. # Copyright (C) 2002-2003
  5. # Michal Dvorak, Jiri Sedlar, Antonin Slavik, Vaclav Slavik, Jozef Smizansky
  6. #
  7. # This program is licensed under GNU General Public License version 2;
  8. # see file COPYING in the top level directory for details.
  9. #
  10. # $Id: PreviewFrame.py,v 1.9 2003/06/18 16:55:08 vaclavslavik Exp $
  11. #
  12. # Window which displays video frame selected on timeline
  13. #
  14.  
  15. from wxPython.wx import *
  16. import globals, model, render, worker, openvip, notify
  17. from conv2 import getBestAudioFormat, getBestVideoFormat
  18.  
  19. class PreviewFrame(wxFrame):
  20.     """This is a simple window which displays the bitmap corresponding
  21.        to the current video frame on timeline. It is updated each time
  22.        you left-click somewhere on timeline."""
  23.     def __init__(self, *args, **kwds):
  24.         # begin wxGlade: PreviewFrame.__init__
  25.         kwds["style"] = wxDEFAULT_DIALOG_STYLE
  26.         wxFrame.__init__(self, *args, **kwds)
  27.         self.bitmap = wxStaticBitmap(self, -1, wxNullBitmap)
  28.  
  29.         self.__set_properties()
  30.         self.__do_layout()
  31.         # end wxGlade
  32.         self.frame_number = 0
  33.         self.model = None
  34.         self.rendering = False
  35.         self.renderAgain = False
  36.         self.pos = 0
  37.         self.vf = self.info = None
  38.         self.enable = False
  39.         render.EVT_RENDERING_DONE(self, self.OnPreviewRendered)
  40.  
  41.     def __set_properties(self):
  42.         # begin wxGlade: PreviewFrame.__set_properties
  43.         self.SetTitle("Preview")
  44.         # end wxGlade
  45.  
  46.     def __do_layout(self):
  47.         # begin wxGlade: PreviewFrame.__do_layout
  48.         sizer = wxBoxSizer(wxVERTICAL)
  49.         sizer.Add(self.bitmap, 0, wxEXPAND, 0)
  50.         self.SetAutoLayout(1)
  51.         self.SetSizer(sizer)
  52.         sizer.Fit(self)
  53.         sizer.SetSizeHints(self)
  54.         self.Layout()
  55.         # end wxGlade
  56.         
  57.     def WaitUntilNotUsed(self):
  58.         if self.rendering:
  59.             self.renderAgain = False
  60.             busy = wxBusyCursor()
  61.             while self.rendering:
  62.                 wxYield()
  63.         
  64.     def SetPosition(self, pos):
  65.         """Used by the timeline widget to tell us the current position
  66.            in seconds. This is later converted to a frame number."""
  67.         self.pos = pos
  68.         self.RenderFrame()
  69.  
  70.     def SetModel(self, model):
  71.         """Informs the window that it should update the bitmap because 
  72.            timeline model changed."""
  73.         self.enable = False
  74.         self.model = model
  75.         if model != None:
  76.             self.vf = getBestVideoFormat(self.model,self.model.length(),self.model.beginning())
  77.         if model == None or self.vf==None:
  78.             img = wxEmptyImage(1,1)
  79.             bmp = wxBitmapFromImage(img)
  80.             self.bitmap.SetBitmap(bmp)
  81.             return
  82.         self.SetSize(wxSize(self.vf.width, self.vf.height))
  83.         s = self.model.tonetworkxml(None, self.vf, None, previewQuality=True)
  84.         self.previewNet = \
  85.                 globals.core.load_network_with_memoutput_from_string(s,
  86.                             "saver",
  87.                             self.vf.width, self.vf.height,
  88.                             openvip.DestCallback(None))
  89.         self.info = globals.core.get_task_file_info(self.previewNet, "saver")
  90.         if len(self.info.video_streams)<1: return
  91.         self.enable = True
  92.         self.RenderFrame()
  93.  
  94.     def RenderFrame(self):
  95.         """Compute the frame number and render the frame. Then next call is
  96.            blocked until the first frame rendering finished."""
  97.         if self.enable == False: return
  98.         if not self.IsShown(): return
  99.         if self.rendering:
  100.             self.renderAgain = True
  101.             return
  102.         self.renderAgain = False
  103.         self.frame_number = int((self.pos-self.model.beginning())*self.vf.fps)
  104.         if not 0<=self.frame_number<self.info.video_streams[0].length:
  105.             img = wxEmptyImage(self.vf.width, self.vf.height)
  106.             bmp = wxBitmapFromImage(img)
  107.             self.bitmap.SetBitmap(bmp)
  108.         else:
  109.             self.rendering = True
  110.             render.renderSingleFrame(self.previewNet, self.frame_number, self)
  111.  
  112.     def OnPreviewRendered(self, event):
  113.         """This method receives the rendered frame and displays it."""
  114.         if event.data != None:
  115.             img = wxEmptyImage(self.vf.width, self.vf.height)
  116.             img.SetData(event.data)
  117.             bmp = wxBitmapFromImage(img)
  118.             self.bitmap.SetBitmap(bmp)
  119.             self.rendering = False
  120.             if self.renderAgain:
  121.                 self.renderAgain = False
  122.                 self.RenderFrame()
  123.  
  124. # end of class PreviewFrame
  125.  
  126.  
  127.